In [19]:
import matplotlib.pyplot as plt
import numpy as np
Define the logistic map as an anonymous function.
$x_{n+1} = r x_n (1 - x_n)$,
where $x_n \in [0,1]$, $r \in [0,4]$.
In [1]:
LogisticMap = lambda x, r: r*x*(1.0-x)
In [2]:
def Iterate(g, x0, N, args=()):
"""
Iterate the passed 1D function g N times, using x0 as the initial value.
The parameters are passed as a tuple that is unpacked and appended to the arguments of g.
"""
for i in range(N):
x0 = g(x0, *args)
return x0
In [76]:
def FindAttractors(r,x0,M):
""" Finds at most M attractors of the LogisticMap at parameter r starting at x0
We assume the iteration converges in itersteps"""
itersteps = 100
result = [] # initialize an empty result list
for i in range(M):
result.append(Iterate(LogisticMap, x0, itersteps+i, (r,)))
return result
In [78]:
""" 1 fixed point"""
rtmp = 1.5
FindAttractors(rtmp,0.5,4)
Out[78]:
In [79]:
""" 2 fixed points"""
rtmp = 3.2
FindAttractors(rtmp,0.5,4)
Out[79]:
In [80]:
""" chaos"""
rtmp = 3.7
FindAttractors(rtmp,0.5,4)
Out[80]:
In [94]:
x0 = 0.5 # initial value
maxa = 40 # maximum number of fixed points that we search for for a given r
attractor = []
x = np.linspace(0,4,440) # values of r
for r in x:
attractor.append(FindAttractors(r,x0,maxa))
for xe, ye in zip(x, attractor):
plt.scatter([xe] * len(ye), ye,s=0.2,c='r')
plt.ylabel('Attractor/fixed point')
plt.xlabel('r')
plt.title('Logistic map $x_{n+1} = r x_n (1 - x_n)$')
plt.savefig('LM.png')
plt.show()
In [ ]: